<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
        1. typeof
          大部分类型都能检查出来，但是对于 null\object\array 无法区分

          if (typeof data === 'object' && !data) {}

        2. A instanceof B
          检查A是否是B的实例（检查 A的某一个__proto__ 是否和 B.prototype 指向同一个对象）
          主要用来检测引用数据类型

        3. Object.prototype.toString.call(xxx).slice(8, -1)
          完美解决方案，可以检测所有数据类型，开发中使用toString方法去封装工具函数去检测类型

        4. Array.isArray
          检测是否是数组类型

        5. A === B
          检测A和B的值和类型都要相等
      */

      // 1. typeof
      // console.log(typeof 123);
      // console.log(typeof "456");
      // console.log(typeof true);
      // console.log(typeof null); // object
      // console.log(typeof undefined);
      // console.log(typeof Symbol());
      // console.log(typeof 123n);
      // console.log(typeof {}); // object
      // console.log(typeof function () {});
      // console.log(typeof []); // object

      // 2. A instanceof B:
      // 检查A是否是B的实例（检查 A的某一个__proto__ 是否和 B.prototype 指向同一个对象）
      // console.log({} instanceof Object);

      // function fn() {}

      // const obj = {};
      // obj.__proto__ = {
      //   __proto__: fn.prototype,
      // };

      // console.log(obj instanceof fn);

      // console.log({} instanceof Object);
      // console.log({} instanceof Array);
      // console.log({} instanceof Function);

      // 3. Object.prototype.toString.call(xxx).slice(8, -1)
      console.log(Object.prototype.toString.call(123).slice(8, -1));
      console.log(Object.prototype.toString.call("123").slice(8, -1));
      console.log(Object.prototype.toString.call(true).slice(8, -1));
      console.log(Object.prototype.toString.call(null).slice(8, -1));
      console.log(Object.prototype.toString.call(undefined).slice(8, -1));
      console.log(Object.prototype.toString.call(Symbol()).slice(8, -1));
      console.log(Object.prototype.toString.call(111n).slice(8, -1));
      console.log(Object.prototype.toString.call({}).slice(8, -1));
      console.log(Object.prototype.toString.call([]).slice(8, -1));
      console.log(Object.prototype.toString.call(function () {}).slice(8, -1));
      console.log(Object.prototype.toString.call(new Date()).slice(8, -1));
      console.log(Object.prototype.toString.call(new RegExp()).slice(8, -1));
    </script>
  </body>
</html>
